# 引入必要的库
import yaml  
from PIL import Image  
from joblib import dump, load  
import numpy as np    
import os  
import time  
from keras.applications.vgg16 import VGG16, preprocess_input  
from keras.preprocessing import image  

  

# 获取 0_setting.yaml 中的键 key 对应的值 value  
def get(key, yaml_file='0_setting.yaml'):  
    with open(yaml_file, 'r', encoding='utf-8') as file:    
        data = yaml.safe_load(file)  
    return data[key]  

 

# 预处理图像, 把图像设置为指定大小之后，提取特征  
def preprocess_image(file_name, new_size=(224, 224)):  
    # 1. 读取并预处理图像  
    img = image.load_img(file_name, target_size=new_size)  
    img_array = image.img_to_array(img)  
    expanded_img_array = np.expand_dims(img_array, axis=0)  
    preprocessed_img = preprocess_input(expanded_img_array)  

      
    # 2. 加载预训练的VGG16模型，不包括顶部的全连接层  
    model = VGG16(weights='imagenet', include_top=False, pooling='max')  

      
    # 3. 使用 VGG16 模型对图像进行特征提取  
    features = model.predict(preprocessed_img)  

      
    # 因为我们只有一个图像，所以直接返回第一个特征向量  
    img_features = features[0]  
    return img_features  
  
# 用joblib把叫做 name 的对象 obj 保存(序列化)到位置 loc  
def dump_obj(obj, name, loc):  # 修改函数名以避免与joblib的dump函数冲突  
    start = time.time()  
    print(f"把{name}保存到{loc}")  
    joblib.dump(obj, loc)  # 使用joblib的dump函数  
    end = time.time()  
    print(f"保存完毕,文件位置:{loc}, 大小:{os.path.getsize(loc) / 1024 / 1024:.3f}M")  
    print(f"运行时间:{end - start:.3f}秒")  

  
# 用joblib读取(反序列化)位置loc的对象obj,对象名为name  
def load_obj(name, loc):  # 修改函数名以避免与joblib的load函数冲突  
    print(f"从{loc}提取文件{name}") 
    obj = joblib.load(loc)  # 使用joblib的load函数 
    return obj